什麼是Junit,Junit是Java上最常見的單元測試工具,它可以幫忙把特定測試檔案執行,更進一步組合成測試套件(test suite)配合script執行自動化測試,發佈測試報告等。如果大家是用Android Studio來開發那做JUnit單元測試就相當容易,因為當你新增project時候Android Studio已經把JUnit的套件設置好了,我們不用特地去下載和做系統配置。
dependencies {
testImplementation 'junit:junit:4.12'
}
Android Studio在build.gradle裡會自動預載JUnit的dependency
接下來用一個測試原生List class的例子來介紹JUnit的基本操作。
class ExampleUnitTest {
lateinit var list: List<Int>
@Before
fun setup() {
list = listOf(1, 10, 100, 1000, 1001, 1002)
}
@Test
fun testSize() {
assertEquals(6, list.size)
}
@Test
fun testIndex() {
assertEquals(1002, list[5])
}
@After
fun tearDown() {
//remove resources
}
}
這是一個測試List功能的unit test檔案,JUnit是經由Annotation的方式來驅動測試流程。我們來介紹一下最基本的三個Annotation
assertEquals是判斷測試值與期望值的一個比較function。其實JUnit的概念很簡單實作上一點都不複雜,所以也讓它很受歡迎。
接下來我們看看Android Studio如何實作Unit test的部份,我們先開始一個新的Android專案如下。
新的專案建立後,在下圖中src/test/java/com.daniel.demotest/目錄下已經有了ExampleUnitTest這個預設的class了
此時我們在ExampleUnitTest檔案上點擊滑鼠左鍵會出現下圖
我們只要執行ExampleUnitTest就會在下方的Run window看到執行結果,當然目前這個結果是Tests passed
說到這裡看似我們的Unit test章節就結束了,但是事實上沒那麼簡單,如下圖這是一個新專案預設MainActivity的畫面,請問要怎麼用unit test的方法來測試畫面中長了一個Hello World!呢?
Sorry,辦不到。因為你沒辦法直接在JUnit的環境launch一個MainActivity的實體,因為Activity如下圖是要從Android device上的Zygote去呼叫APK,經由Layout inflation的過程最後把畫面render出來。而JUnit只能單純的幫我們呼叫單一檔案無法去執行build好的APK。
所以unit test只能單純測試不包含UI的邏輯部份,那你應該會想那unit test在android不就沒用了?android不就是要UI為主的application。這句話只對了一半,雖然mobile application都是要靠UI呈現,但在還是有一些與UI無關的邏輯部份可以用unit test的方式來保證產出的品質。
但是剛剛提到unit test無法動態執行APK那要如何把滿滿都是UI行為的Android Application放到unit test裡執行?這時候我們可以靠一些Application的設計模式、如MVP或是MVVM等架構來幫助我們建立一套可以被測試的架構,在後續章節會繼續介紹。